#include <string.h>    //C风格字符串的标准库头文件
#include <iostream>
#include <string>      //C++风格字符串标准库头文件

using std::cout;
using std::endl;
using std::string;

void test0()
{
    const char * pstr1 = "hello";//文字常量区
    const char * pstr2 = "world";//不能修改

    //拼接字符串
    //加上()   会进行清零操作(初始化)
    char * pstr3 = new char[strlen(pstr1) + strlen(pstr2) + 1]();
    strcpy(pstr3, pstr1);//字符串拷贝
    strcat(pstr3, pstr2);//字符串拼接
    
    printf("pstr3:%s\n", pstr3);

    for(int i = 0; i < strlen(pstr1); ++i) {
        printf("%c\n", pstr1[i]);
    }

    delete []pstr3;//加上中括号，回收的是一个数组
}

void test1()
{
    //s1: 相当于将C风格字符串转换为C++风格字符串
    string s1("hello");
    string s2(3, 'a');
    cout << "s1:" << s1 << endl;
    cout << "s2:" << s2 << endl;
    
    //获取string字符串的长度
    cout << "s1' size:" << s1.size() << endl;
    cout << "s2' length:" << s2.length() << endl;

    //字符串的拼接操作
    string s3 = s1 + s2;
    cout << "s3:" << s3 << endl;

    char arr[20] = {0};
    //将C++风格字符串转换为C风格字符串
    const char * ps1 = s1.c_str();
    strcpy(arr, s1.c_str());

    printf("&s1: %p\n", &s1);//s1字符串对象的首地址
    printf("s1' c_str: %p\n", s1.c_str());//s1字符串内容的首地址

    //C++风格字符串的遍历
    for(int i = 0; i < s1.size(); ++i) {
        cout << s1[i] << endl;
    }

    //增强for循环
    //冒号左边是s1中的某一个字符，右边就是s1
    //& 是引用符号，表示获取的是s1中的字符, & 不能少
    //cha & ch = s1[i]
    //如果去掉&之后，将相当于 char ch = s1[i];
    for(char ch : s1) {
        cout << ch << endl;
    }
    cout << "s1:" << s1 << endl;
    //实际使用时，不需要判断每一个元素的类型
    //auto 自动推断的关键字,表示会自动推导每一个元素的类型
    for(auto & ch : s1) {
        ch += 1;
        //cout << ch << endl;
    }
    cout << "s1:" << s1 << endl;

}

int main()
{
    test0();
    cout << endl;
    test1();
    return 0;
}

